﻿Язык FL
admin|2009/01/15 23:57:03
##PAGE##
{TOC}

Далее кратко рассказывается о языке FL - кульминации развития FP.
Обрисованы основные черты языка и некоторые практические применения.
Тем не менее этот раздел не дает хоть сколь-нибудь полного опиcания
языка, а лишь только дает заинтересованному читателю возможность
продолжить изучение этого направления функционального
программирования самостоятельно.
===Ключевые особенности===
 Язык FL (от Function Level), по утверждение его [Refrences|авторов] ,
 создавался, в первую очередь, как язык обладающий простой и
 практически полезной денотационной семантикой, и поэтому минималистичный,
 наделенный лишь минимумом функции, необходимых для написания
 реальных, не игрушечных программ.

 Сейчас кратко перечислим основные черты FL как языка
 функционального программирования:

#'''Функциональный подход. '''В этом аспекте проявляется основная
черта FL, унаслдованная от FP: программы получаются путем
комбинирования других, более простых,  программ. В FL нет свободных
переменных, его , как и Хаскелл можно отнести к "чистым" языкам
функционального программирования.
#'''Функции высших порядков.'''
В отличие от FP, FL позволяет
определять новые функции высших порядков. При это наследуются
основные функциональные формы из FP.
#'''Область видимости.'''
При определении функций допустимо
использование локальных определений по типу ''where''.
#'''Исключения.'''
В FL предусмотрены исключения, которые, в
отличие от Хаскелла, но аналогично ML, являются объектами "первого
класса".
#'''Ввод-вывод.'''
В FL используется подход, который был
предшественником монад, реализованных в языке Хаскелл: в FL каждая
функция имеет неявный дополнительный аргумент History, который можно
модифицировать только при помощи примитивов in и out. Таким образом
сохраняется ясность семнатики и неперегруженность синтаксиса.
#'''Типы данных.'''
В FL объекты имеют типы и
 можно определять новые типы данных на основе существующих при помощи характеристических функций.
 Язык FL - динамически типизированный, но с мощной системой вывода и
 проверки типов, которая является расширение системы типов
 Хиндли-Милнера. Смотри \cite{FL} для более подробного описания.


 В лабораториях IBM для FL был создан компилятор, целевым языком
 которого был C, что обеспечило возможность доступа к уже
 существующему коду из FL,и, наоборот, легкому интегрированию
 библиотек на FL в большие приложения. К сожалению, последний
 разработки, касающиеся этого направление датированы 1993 годом,
 единственным реальным применениями FL остается среда моделирования
 Plasm, рассказом о которой завершается этот раздел.

===Plasm - язык геометрического моделирования===
====Общее описание====
PLaSM (от Programming LAnguage for Symbolic Modeling),
это функциональный язык для описания геометрических объектов,
разработанный группой CAD в Римском университете  "La Sapienza"
(Италия) и на данный момент развиваемый группой вычислительной
геометрии в университете Roma Tre.

 Основные особенности:

* Геометрические объекты соответсвуют выраженям языка программирования
* Алгебра для рассуждения о многогранниках независмо от их размерности
* Единый, не зависящий от размерности, подход к представлению и
обработке геометрических данных
* Допустимость геометрических описаний гарантируется синтаксисом
языка


 PLaSM можно рассматривать как ориентированное на геометрию
подмножество  FL:

* Возможность работать с функциям высших порядков
* Введена возможность работать с выражениям, значениями которых
являются наборы многогранников
* Несколько изменена и упрощена система областей видимость и
сред
* Отсутсвие проверки на соответсвие шаблону,
*Введены имена для любого объекта языка.
* Есть возможность перегрузки операторов, например:
*# Сложение чисел: <math>3+4</math>
*# Сложение векторов: <math>\langle2,4\rangle+\langle8,8\rangle</math>
*# Сложение как функция высших порядков: <math>(sin+cos):x</math>

 Синтаксис PlasM очень похож на синтакс FL, различия заключаются
лишь в отказе от использования некоторых символов, введения
формальных параметров для функций и появлением комбинирующих форм AC
(apply-in-composition, применить-с-композицией) и AS (применить
последовательно), которые нужны для использования функции с большим
числом фактических параметров чем формальных.
====Пример 1 - 3D фигура====
 Рассмотрим небольшой пример, задающий несложную фигуру, показанную
 на рисунке
[imageleft||{UP}FL%2fex2.gif]



<nowiki>
  DEF MyPol = MKPOL: WHERE
  verts = <<0,0,0>,<10,0,0>,<10,10,0>,<0,10,0>,
           <0,0,10>,<10,0,10>,<10,10,10>,<0,10,10>>,

  cells = <<1,2,3,4>,<1,2,5,6>,<3,4,7,8>>,
  pols  = <<1,2,3,4>>

END
MyPol;
</nowiki>


 Этот пример генерирует геометрический объект, вызывая функцию
MyPol, которая перед этим определяется как функция третего порядка
MKPOL где именованные формальные параметры verts, cells, pols
заменены на соответствующие наборы векторов. MKPOL создает наборы
многогранников на основе заданного набора точек(verts), объединяя их
в выпуклые многоугольники(cells), а затем в многогранники(pols). Как
работает функция MKPOLS более подробно смотри на
[[http://www.plasm.net/cplasm/plasm1.html]].

 Этот пример также демонстрирует два типа определений в Plasm -
 локальные и глобальные. Глобальные определения функций видны во всей
 програме и для них разрешена <math>\lambda</math>-подстановка параметров(она как раз используется в этом
 примере).

====Пример 2 - график синуса====
 В этом примере табулируется функция синуса.

<nowiki>DEF SinFun = [u, sin~u] WHERE  u = S1  END;
DEF Domain (n::IsInt) = (QUOTE ~ #:n):(2*PI/n);

MAP:SinFun:(Domain:32);
</nowiki>


 Первая строка примера определяет функцию SinFun, используя
знакомую нам еще по FP комбинирующую форму конструкции, и локальное
определение <math>u</math> как селектора первого объекта последовательности, а
также примитивной функции sin. Обращаем внимание, что операция
композиции здесь обозначается ''~''.

 Вторая строка определяю функцию Domain, которая похожа на функции
типа ints, смотри задачу 2 на странице \pageref{ints}. Domain
разбивает отрезок от 0 до <math>2\pi</math> на n равных частей. Формальный
параметр n имеет тип, который проверяется характеристической
функцией IsInt во время исполнения \--- как было сказано выше, FL
является динамически типизированным языком. Также этот определение использует
встроенные примитивы QUOTE и <nowiki>#</nowiki>. Первый из них задает многогранник размерности 1(отрезок),
а второй - создает последовательность длиной n, n раз инстацируя выражение-аргумент.

 Третья строка - это специальная версия Map,
вторым параметром которого выступает не список,
а набор многогранников (в данном случае отрезков).

Два этих примера показывают как синтаксис FL, так и особенности
PlasM - примитивы для работы с геометрией. Вообще говоря, PlasM
содержит примитивы для афинных преобразований, простейших
геометрических фигур, отсечений и объединений объектов и много
другого.

===Упражнения===
# Напишите программу на PlasM, которая рисует вот такую фигуру:
[imageleft||{UP}FL%2fex1.gif]
